from openai import OpenAI
from typing import Dict, Any, List
import json
import os

# 投诉信息提取专家系统提示词
COMPLAINT_EXTRACTOR_PROMPT = """你是投诉信息提取专家。职责：
从投诉文本中提取以下五个维度的信息，并以JSON格式输出：
{
    "紧急度": {
        "等级": "",  // 分为：特急、紧急、普通、一般
        "判断依据": ""  // 说明判断紧急程度的依据
    },
    "地区": {
        "区域": "",  // 所属行政区
        "街道": ""   // 所属街道
    },
    "地址": {
        "详细地址": "",  // 完整地址信息
        "地址要素": {    // 地址解析
            "小区名称": "",
            "楼栋号": "",
            "单元号": "",
            "楼层": "",
            "房间号": ""
    },
    "情绪": {
        "情绪类型": "",  // 如：愤怒、焦虑、失望、平和等，具体根据内容来定
        "情绪强度": "",  // 分为：强烈、中等、轻微
        "关键表述": []   // 体现情绪的关键词或短语
    }
    }
}

注意事项：
1. 提取的信息应尽可能完整和准确
2. 所有字段必须存在，如信息缺失则填写空字符串
3. 重点关注文本中的时间词、程度词、情感词等表述
"""

# 关键词提取专家提示词
KEYWORD_EXTRACTOR_PROMPT = """你是关键词提取专家。职责：
从投诉文本中提取关键词，输出格式如下：
{
    "重点问题": [], // 提取1-3个最核心的问题短语，如['多次停电']
    "关键词列表": [] // 提取3-8个关键词或短语，如['又没电', '投诉意愿', '停电', '故障', '正常用电']
}

提取规则：
1. 重点问题：
   - 识别投诉中最核心的问题
   - 通常是一个完整的短语
   - 优先提取带有频次、程度、时间等修饰的问题描述

2. 关键词列表：
   - 包含问题描述词
   - 包含状态词
   - 包含程度词
   - 包含时间词
   - 包含诉求词
"""

# 投诉分类专家提示词
# 预定义投诉类别列表
COMPLAINT_CATEGORIES = [
    "房屋维修类", "物业服务类", "市政设施类", "环境卫生类", "噪音扰民类",
    "车辆管理类", "安全隐患类", "公共设施类", "绿化养护类", "施工管理类",
    "占道经营类", "消防安全类", "宠物管理类", "邻里纠纷类", "其他类"
]

COMPLAINT_CLASSIFIER_PROMPT = f"""你是投诉分类专家。职责：
分析投诉内容，将投诉归类到预定义类别，输出格式如下：
{{
    "投诉类别": "", // 必须是以下类别之一
    "分类依据": "", // 说明分类原因
    "涉及部门": [], // 可能需要协调的部门列表
    "建议处理时限": "" // 建议的处理时间期限
}}

预定义类别：
{', '.join(COMPLAINT_CATEGORIES)}

注意事项：
1. 准确判断投诉类别
2. 详细说明分类依据
3. 列出可能需要协调的相关部门
4. 根据问题严重程度和紧急度给出建议处理时限
"""

class ComplaintProcessorLocal:
    def __init__(self, model_name: str = "qwen-2.5-72b"):
    # def __init__(self, model_name: str = "glm-4-flash"):
        """初始化配置"""
        self.client = OpenAI(
            api_key=os.getenv("OPENAI_API_KEY", "EMPTY"),
            base_url="http://172.16.8.36:9997/v1"
            # api_key='ac44cd9f86c3105bb83a27d9d62f5a37.p6H8re1oc9XFT2q1',
            # base_url="https://open.bigmodel.cn/api/paas/v4/"
        )
        self.model_name = model_name

    def process_complaint(self, complaint_text: str) -> Dict[str, Any]:
        """处理投诉内容"""
        try:
            # 1. 提取基本信息
            extract_prompt = f"""
            {COMPLAINT_EXTRACTOR_PROMPT}

            请从以下投诉内容中提取关键信息，严格按照JSON格式返回：
            {complaint_text}
            """
            
            extracted_response = self.client.chat.completions.create(
                model=self.model_name,
                messages=[
                    {"role": "system", "content": COMPLAINT_EXTRACTOR_PROMPT},
                    {"role": "user", "content": complaint_text}
                ],
                temperature=0.1
            )
            
            extracted_data = extracted_response.choices[0].message.content
            if not extracted_data:
                return None
                
            try:
                json_start = extracted_data.find('{')
                json_end = extracted_data.rfind('}') + 1
                if json_start >= 0 and json_end > json_start:
                    extracted_json = json.loads(extracted_data[json_start:json_end])
                else:
                    return None
            except json.JSONDecodeError:
                print("提取的数据不是有效的JSON格式")
                return None
            
            # 2. 提取关键词
            keyword_prompt = f"""
            {KEYWORD_EXTRACTOR_PROMPT}

            请从以下投诉内容中提取关键词：
            {complaint_text}
            """
            
            keyword_response = self.client.chat.completions.create(
                model=self.model_name,
                messages=[
                    {"role": "system", "content": KEYWORD_EXTRACTOR_PROMPT},
                    {"role": "user", "content": complaint_text}
                ],
                temperature=0.1
            )
            
            keyword_data = keyword_response.choices[0].message.content
            if not keyword_data:
                return None
                
            try:
                json_start = keyword_data.find('{')
                json_end = keyword_data.rfind('}') + 1
                if json_start >= 0 and json_end > json_start:
                    keyword_json = json.loads(keyword_data[json_start:json_end])
                else:
                    return None
            except json.JSONDecodeError:
                print("关键词提取结果不是有效的JSON格式")
                return None

            # 3. 投诉分类
            classify_prompt = f"""
            {COMPLAINT_CLASSIFIER_PROMPT}

            请对以下投诉内容进行分类：
            {complaint_text}
            """
            
            classify_response = self.client.chat.completions.create(
                model=self.model_name,
                messages=[
                    {"role": "system", "content": COMPLAINT_CLASSIFIER_PROMPT},
                    {"role": "user", "content": complaint_text}
                ],
                temperature=0.1
            )
            
            classify_data = classify_response.choices[0].message.content
            if not classify_data:
                return None
                
            try:
                json_start = classify_data.find('{')
                json_end = classify_data.rfind('}') + 1
                if json_start >= 0 and json_end > json_start:
                    classify_json = json.loads(classify_data[json_start:json_end])
                else:
                    return None
            except json.JSONDecodeError:
                print("分类结果不是有效的JSON格式")
                return None

            # 4. 合并结果
            result = {
                "五维分析": extracted_json,
                "关键词": keyword_json,
                "分类结果": classify_json
            }
            
            return result

        except Exception as e:
            print(f"处理投诉内容时出错: {e}")
            return None

    def save_result(self, result: Dict[str, Any], output_dir: str, file_id: str) -> bool:
        """保存处理结果"""
        try:
            os.makedirs(output_dir, exist_ok=True)
            output_file = os.path.join(output_dir, f"{file_id}.json")
            with open(output_file, 'w', encoding='utf-8') as f:
                json.dump(result, f, ensure_ascii=False, indent=2)
            return True
        except Exception as e:
            print(f"保存结果失败: {e}")
            return False

# 测试代码
if __name__ == "__main__":
    # 测试数据
    test_complaint = """丁先生反映：李沧区花安路长春花园小区，在小区东北门外经常有收废品人员，使用三轮车占据人行道，要求部门管理禁止占道收废品，请相关部门落实处理并答复。"""
    test_complaint = """孙女士反映：自己是市南区海龙路6号欧洲花园小区的居民，居住在父母的房子里，想要建立孕期档案，需要联系居委会开具居住证明，要求部门调查该小区属于哪个居委会管理，请责任部门落实处理并答复。"""
    # test_complaint = """王先生反映：市北区山东路17号“丽天馨苑 ”30号楼下消防通道被车辆占领，已告知物业，物业一直没有处理好，要求禁止在消防通道上停车，请责任部门落实处理并答复。"""

    # 初始化处理器
    processor = ComplaintProcessorLocal()
    
    # 处理投诉
    result = processor.process_complaint(test_complaint)
    if result:
        print("\n处理结果:")
        print(json.dumps(result, ensure_ascii=False, indent=2))
        
        # ��存结果
        processor.save_result(result, "processed_complaints", "test_complaint")